package com.pawernode.message;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 消息接收者组件
 * 该类主要用于监听和处理来自RabbitMQ的消息
 */
@Component
@Slf4j
public class ReceiverMessage {

    /**
     * 监听特定队列并接收消息
     * 当队列名为"queue.reliability"的队列中有消息到达时，该方法会被调用
     *
     * @param message 接收到的消息，包含消息体和消息属性
     * @param channel 消息所在的通道，通过它可以对消息进行确认或拒绝
     */
    @RabbitListener(queues = "queue.cluster")
    public void receiveMsg(Message message, Channel channel) {
        // 获取消息的唯一标词，类似于身份证
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            // 日志记录接收到的消息内容
            log.info("接收到的消息为：{}", new String(message.getBody()));
            // TODO 插入订单数据deng
//            int a = 10 / 0;
            // 手动确认消息,false表示不批量确认,只有一个消息确认，true表示批量确认
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            // 当消息处理出现异常时，记录错误日志
            log.error("消息处理出现问题");
            try {
                // 拒绝消息，false表示不批量拒绝，true表示重新入队列
                channel.basicNack(deliveryTag, false, true);
            } catch (IOException ex) {
                // 如果消息拒绝过程中出现IO异常，则抛出运行时异常
                throw new RuntimeException(ex);
            }
            // 抛出运行时异常，表示消息处理失败
            throw new RuntimeException(e);
        }
    }
}
